<?php

namespace App\Http\Controllers\User;

use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    public function __construct()
    {
//        只有登陆的用户才能进入UserController控制器,并调用里面的方法
        $this->middleware('auth');
    }
//这个方法是用户关注方法
    public function follow(User $user){

        //通过模型策略,对模型的follow方法进行验证
        $this->authorize('follow',$user);
        //使用toggle()方法如果当前用户auth()->user()已经关注了传递过了的$user用户就取消关注,没有关注就进行关注
        auth()->user()->follow()->toggle([$user['id']]);
        return back();

    }


    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($info)
    {
        //edu中的用户中心在传递过来路由的时候会传递过来2个参数,在这个edit方法中根据传递过来的参数渲染不同的模板视图
        //在这里可以通过auth()->user()获取当前登陆的用户对象
        $user = auth()->user();
    return    view('user.edit_'.$info,compact('user'));

    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    //当这里$info形参的名称与路由中的变量名称一样的时候,在实例化User类之后会依赖注入,获取edit操作的user对象.
    //如果这里的形参变量名与路由中的变量名不一样的时候,只会实例话出来一个空的user对象.
    //但是这里由于是当前用户自己修改自己,我们可以直接通过auth()->user()所以这里用户用依赖注入都可以.之所以前台要传递一个参数过来只是为了满足PUT路由的需要
    public function update(Request $request, User $info)
    {
//        dd(str_replace('\\','/',$request->input('icon')));
//        这里需要进行验证,通过$request可以获取到用户通过前台表单提交过来的数据
        $this->validate($request,[
//            验证的时候nullable是对值进行验证,下面的验证规则是如果request请求过来的数据为null就不进行后面继续验证,如果不为空就继续验证.但是当用户更新用户图像的时候request请求过来的数据中根本就没有password,这个时候用下面的验证就不好.需要一个对request过来的数据键名的验证
//            'password'=>'nullable|confirmed|min:3',
        //但是在这里我们对这个update方法进行了复用,让update方法既能够更新密码,又能够更新用户图像.
            //这里需要一个对用户request过来的数据的键名的验证,sometimes表示当request请求的数据有password的时候继续执行后面的验证,没有password的时候就不执行后面的验证
            'password'=>'sometimes|confirmed|min:3',
        ],[
            'password.required'=>'密码不能为空',
            'password.confirmed'=>'两次密码必须一致',
            'password.min'=>'密码不能小于3位',
        ]);

//        接着需要判断用户是请求修改密码还是要修改图像,可以通过$request请求的数据中是否有password的方式进行判断
        if ($request->input('password')){
//            如果进入到这个if判断体中,说明用户request请求过来的数据中有password那就说明是要重置密码

        //密码修改,通过上面的验证后,就可以修改更新数据库了
        //通过调用$info当前用户的update方法修改密码
//        $info->update($request->all());
        //request请求到的是密码的明文数据,需要加密以后存放到数据表中
        //也可以不用依赖注入直接通过auth()->user()方法获取当前用户
        auth()->user()->update(['password'=>bcrypt($request->input('password'))]);
        //到这里用户密码修改成功,可以back()并返回成功提示
        return back()->with('success','密码修改成功');
        }else{
//            否则为修改用户图标,由于我win7系统的分隔符号是\,需要调整成/
            $url = str_replace('\\','/',$request->input('icon'));
            auth()->user()->update(['icon'=>$url]);
            return back()->with('success','图像修改成功');
        }


    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}
